package io.sdph.documents;

import io.sdph.documents.exceptions.InvoiceException;
import io.sdph.documents.model.Invoice;
import io.sdph.documents.model.InvoiceType;
import io.sdph.documents.model.PaymentMethod;
import io.sdph.products.model.Product;
import io.sdph.userprofile.model.User;

import java.util.List;
import java.util.Map;
import java.util.Date;

/**
 * Interfejs managera do zarządzania fakturami.
 *
 * @author Konrad Szewczyk
 * @since 0.0.1
 */
public interface IInvoiceManager {

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param user - użytkownik systemu
     * @return lista faktur (not null)
     */
    public List<Invoice> getInvoices(User user);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param user - użytkownik systemu
     * @param dateFrom - wystawione od daty
     * @param dateTo - wystawione do daty
     * @return lista faktur (not null)
     */
    //public List<Invoice> getInvoices(User user, Date dateFrom, Date dateTo);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param user - użytkownik systemu
     * @param invoiceType - typ faktury
     * @return lista faktur (not null)
     */
    //public List<Invoice> getInvoices(User user, InvoiceType invoiceType);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param user - użytkownik systemu
     * @param invoiceType - typ faktury
     * @param dateFrom - wystawione od daty
     * @param dateTo - wystawione do daty
     * @return lista faktur (not null)
     */
    //public List<Invoice> getInvoices(User user, InvoiceType invoiceType, Date dateFrom, Date dateTo);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param number - numer faktury
     * @return lista faktur (not null)
     */
    public Invoice getInvoice(String number);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param invoice - faktura do druku
     * @return lista faktur (not null)
     */
    public Byte[] generatePDF(Invoice invoice);

    /**
     * Metoda pobiera faktury wystawione danemu użytkownikowi systemu.
     *
     * @param invoice - faktura do druku
     */
    public void printInvoice(Invoice invoice);

    /**
     * Metoda zapisuje fakturę do bazy.
     * 
     * @param invoice - obiekt faktury
     */
    public void saveInvoice(Invoice invoice);
}
